import org.junit.Test;

import java.util.HashSet;
import java.util.Iterator;

public class HashSetTest {
    @Test
    public void test1() {
        HashSet hs = new HashSet();
        hs.add(1);
        hs.add(2);
        hs.add(3);
        //不会添加重复的元素
        hs.add(1);

        System.out.println(hs);

        hs.remove(2);
        System.out.println(hs);

        System.out.println("是否包含3：" + hs.contains(3));
        System.out.println("列表长度是：" + hs.size());
//        hs.clear();
        System.out.println("列表是否为空： " + hs.isEmpty());

        Iterator it = hs.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }

    @Test
    public void test2() {
        HashSet list = new HashSet();
        while (list.size() < 10) {
            int number = (int) (Math.random() * 20 + 1);
            list.add(number);
        }
        System.out.println(list);
    }

    @Test
    public void test3() {
        HashSet list = new HashSet();
        Person1 p1 = new Person1("jack", 12);
        Person1 p2 = new Person1("rose", 22);
        list.add(p1);
        list.add(p2);

        //初始
        System.out.println(list);

        System.out.println("-----------------------------");

        p1.setName("jack1");
        /*
            在 HashSet 中，元素的存储位置是基于 hashCode 值计算的。
            当 p1 被添加到 HashSet 时，它的 hashCode 是基于 name="jack" 和 id=12 计算的。
            当 p1.setName("jack1") 修改了 name 属性后，p1 的 hashCode 值发生了变化。
            调用 list.remove(p1) 时，HashSet 会基于新的 hashCode 值查找元素，但此时 p1
            的存储位置已经与最初添加时的位置不同，因此无法找到并删除 p1。
         */
        list.remove(p1);
        System.out.println(list);

        System.out.println("------------------------------");
        /*
            当 list.add(new Person1("jack1", 12)) 时，HashSet 会计算新对象的 hashCode，
            并检查是否已存在相同的对象。
            由于 p1 的 name 已经被修改为 "jack1"，HashSet中已经存在
            但是，HashSet 无法正确识别这两个对象是相同的，因为 p1 的存储位置已经与它的 hashCode 不匹配。
            因此，HashSet 会将新对象添加到集合中，导致重复。
         */
        list.add(new Person1("jack1", 12));
        System.out.println(list);

        System.out.println("------------------------------");
        /*
            新对象的 name="jack" 和 id=12 与最初的 p1 相同。
            但由于 p1 的 name 已经被修改为 "jack1"，HashSet 中不再存在 Person1{name='jack', id=12} 的对象。
            因此，HashSet 会将新对象添加到集合中。
         */
        list.add(new Person1("jack", 12));
        System.out.println(list);


    }
}
